package com.yhs0092.servicecomb.little_samples.edge_pass_picture.backend.service;

import java.io.File;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.HttpHeaders;

import org.apache.servicecomb.common.rest.resource.ClassPathStaticResourceHandler;
import org.apache.servicecomb.common.rest.resource.StaticResourceHandler;
import org.apache.servicecomb.provider.rest.common.RestSchema;
import org.apache.servicecomb.swagger.invocation.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.swagger.annotations.ApiResponse;

@RestSchema(schemaId = "demo")
@Path("/backend/v0")
public class DemoService {

  public static final Logger LOGGER = LoggerFactory.getLogger(DemoService.class);

  private StaticResourceHandler resourceHandler;

  public DemoService() {
    // 简单复用一下 Java-Chassis 的 inspector 模块中提供的静态资源读取工具。
    // 实际业务会比这个更为复杂，获取下载文件流的操作可能需要开发者自行实现。
    resourceHandler = new ClassPathStaticResourceHandler();
    // 这个demo的静态资源存放在 /resources/demo-static 目录下
    resourceHandler.setWebRoot("demo-static/");
  }

  /**
   * 下载图片，或者浏览器页面展示图片，其实对于服务器端就是一个文件下载的过程，至于服务器是将图片展示在浏览器页面上还是作为文件下载保存，
   * 这取决于 response 的 Content-Type。
   * 示例请求:
   * <ul>
   *   <li>http://localhost:8080/backend/v0/static/image.png</li>
   *   <li>http://localhost:8080/backend/v0/static/image2.PNG</li>
   * </ul>
   */
  @Path("/static/{path : .+}") // 这种写法是正则表达式匹配请求path，也就是请求path前缀为 /backend/v0/static/ 的请求都由此方法处理
  @GET
  @ApiResponse(code = 200, message = "", response = File.class)
  public Response getStaticResource(@PathParam("path") String path) {
    // 这里使用 Java-Chassis 自带的 ClassPathStaticResourceHandler 只是为了简化demo开发，实际业务中需要根据需求从不同的地方获取文件流
    // 具体其他的开发方式请参考 Java-Chassis 的文件下载功能说明文档
    Response response = resourceHandler.handle(path);
    // resourceHandler会根据下载文件的后缀判断 response 的 Content-Type
    // 如果请求的是 image.png，因为 .png 后缀能够被自动识别，所以 response Content-Type = image/png
    // 此时下载图片会被浏览器识别，直接在页面上显示
    // 如果请求的是 image2.PNG， 因为 .PNG 后缀不会被自动识别，所以 response Content-Type = application/octet-stream
    // 此时浏览器只知道这是一个下载文件流，于是它不会以图片形式将文件展示在页面上，而是作为一个下载文件保存起来
    LOGGER.info("reponse Content-Type is {}", response.getHeaders().getHeader(HttpHeaders.CONTENT_TYPE));
    return response;
  }
}
